package com.cxj.cxj_test_cloud.common.di;


import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;

import com.cxj.cxj_test_cloud.base.application.BaseApplication;
import com.cxj.cxj_test_cloud.common.di.component.AppComponent;

import dagger.android.AndroidInjection;
import dagger.android.support.AndroidSupportInjection;

/**
 * 全局依赖图初始化：创建并配置 Dagger 的根组件
 * Application 级注入：完成 Application 的依赖注入
 * 自动 Activity 注入：在 Activity 创建时自动注入依赖
 * 自动 Fragment 注入：在 Fragment 创建时自动注入依赖
 */
public class AppInjector {
    public static AppComponent init(BaseApplication application) {
        AppComponent appComponent = DaggerAppComponent
                .builder()
                .setApplication(application)//todo 在AppComponent中提供的方法
                .build();
        /**
         * 让 Dagger 把 AppComponent 依赖图中已经准备好的所有单例
         * （ServerApi、SharedPreferences、CrashHandler…）一次性注入到 BaseApplication 自身的 @Inject 字段/方法里。
         */
        appComponent.inject(application);//todo 表示什么

        application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                injectActivity(activity);//todo application创建之时就开始注入

            }

            @Override
            public void onActivityStarted(@NonNull Activity activity) {

            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {

            }

            @Override
            public void onActivityPaused(@NonNull Activity activity) {

            }

            @Override
            public void onActivityStopped(@NonNull Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {

            }
        });

        return appComponent;
    }

    /**
     * 注入到activity与fragment
     * @param activity
     */
    private static void injectActivity(Activity activity) {
        //注入到Activity
        if (activity instanceof Injectable) {  //todo  实现Injectable接口方法的才可以注入
            Injectable injectableAct = (Injectable) activity;
            //todo 返回是否需要进行dagger注入，若是需要注入需要把对应的activity声明到ActivityInjectorModule,而Injectable接口方法的意义就是为了控制注入
            if (injectableAct.needDaggerInject()) {
                /**
                 * 把当前 Activity / Fragment 的 @Inject 字段、@Inject 方法一次性完成依赖注入，背后自动找到正确的子组件并执行注入逻辑。
                 */
                AndroidInjection.inject(activity);//todo 一般是写在基类或者是BaseApplication
            }
        }
        //注入到fragment
        if (activity instanceof FragmentActivity) {
            ((FragmentActivity) activity).getSupportFragmentManager().registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
                @Override
                public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {
                    if (f instanceof Injectable) {
                        Injectable injectableFragment = (Injectable) f;
                        if (injectableFragment.needDaggerInject()) {
                            AndroidSupportInjection.inject(f);
                        }
                    }
                    super.onFragmentCreated(fm, f, savedInstanceState);
                }
            }, true);
        }
    }
}
